package com.witframework.core.logic;

import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import bsh.EvalError;
import bsh.Interpreter;

/**
 * bsh脚本解释类
 * @author wuxinyang
 *
 */
public class BshBusinessLogicInterpreter {
	static String version="0.1 beta";
	static String bshVersion;
	Interpreter interpreter = new Interpreter();
	static String getBshVersion() {
		if (bshVersion != null) {
			return bshVersion;
		}
		Interpreter interpreter = new Interpreter();
		try {
			interpreter.eval(new InputStreamReader((bsh.servlet.BshServlet.class).getResource("getVersion.bsh").openStream()));
			bshVersion = (String) interpreter.eval("getVersion()");
		} catch (Exception exception) {
			bshVersion = "BeanShell: unknown version";
		}
		return bshVersion;
	}
	public void addVar(String name,Object obj){
		try {
			interpreter.set(name,obj);
		} catch (EvalError e) {
			throw new BussinessLogicException("设置Bsh变量错误",e);
		}
	}
	/**
	 * 执行bsh脚本
	 * @param statements 脚本
	 * @param objects 设置的对象 名称是对象的类短名称，如果有相同的类，则名称顺序加1
	 * @return 最后运算的对象
	 */
	public Object eval(String statements,Object... objects){
			Map<String,Integer> namesMap=new HashMap<String,Integer>();
			try {
				for(Object obj:objects){
					String varName=obj.getClass().getSimpleName();
					Integer sequence=(Integer)namesMap.get(varName);
					if(sequence==null){
						namesMap.put(obj.getClass().getSimpleName(),Integer.valueOf(0));
						interpreter.set(varName.toLowerCase(), obj);
					}
					else{
						namesMap.put(varName,Integer.valueOf(sequence.intValue()+1));
						interpreter.set(varName.toLowerCase()+(sequence.intValue()+1), obj);
					}

				}
				return interpreter.eval(statements);
			} catch (EvalError e) {
				throw new BussinessLogicException("执行bshStatements错误",e);
			}
	}
	/**
	 * 获取指定名称的对象实例,对象的设置名称，该名称是对象的类短名称
	 *
	 * @param name 对象的设置名称，该名称是对象的类短名称
	 * @return 对象
	 * @throws EvalError
	 * @see #eval(String, Object...)
	 */
	public Object get(String name) throws EvalError{
		return interpreter.get(name);
	}

}
